// 输出什么?
const { name: myName } = { name: "Lydia" };

console.log(name);

// A.
// "Lydia"

// B.
// "myName"

// C.
// undefined

// D.
// ReferenceError

// 正确答案：
// D
// 解析：
// 当我们从右侧的对象解构属性name时，我们将其值Lydia分配给名为myName的变量。
// 使用{name：myName}，我们是在告诉JavaScript我们要创建一个名为myName的新变量，并且其值是右侧对象的name属性的值。

// 当我们尝试打印name，一个未定义的变量时，就会引发ReferenceError。




// 输出什么?
function addToList(item, list) {

return list.push(item);

}

const result = addToList("apple", ["banana"]);

console.log(result);

// A.
// ['apple', 'banana']

// B.
// 2

// C.
// true

// D.
// undefined

// 正确答案：
// B
// 解析：
// push()方法返回新数组的长度。一开始，数组包含一个元素（字符串"banana"），长度为1。 在数组中添加字符串"apple"后，长度变为2，并将从addToList函数返回。
// push方法修改原始数组，如果你想从函数返回数组而不是数组长度，那么应该在push item之后返回list。




// 输出什么?
const box = { x: 10, y: 20 };

Object.freeze(box);

const shape = box;

shape.x = 100;

console.log(shape)

// A.
// { x: 100, y: 20 }

// B.
// { x: 10, y: 20 }

// C.
// { x: 100 }

// D.
// ReferenceError

// 正确答案：
// B
// 解析：
// Object.freeze使得无法添加、删除或修改对象的属性（除非属性的值是另一个对象）。
// 当我们创建变量shape并将其设置为等于冻结对象box时，shape指向的也是冻结对象。你可以使用Object.isFrozen检查一个对象是否被冻结，上述情况，Object.isFrozen（shape）将返回true。

// 由于shape被冻结，并且x的值不是对象，所以我们不能修改属性x。 x仍然等于10，{x：10，y：20}被打印。

// 注意，上述例子我们对属性x进行修改，可能会导致抛出TypeError异常（最常见但不仅限于严格模式下时）。




// 使用哪个构造函数可以成功继承Dog类?
class Dog {

constructor(name) {

this.name = name;

}

};

class Labrador extends Dog {

// 1

constructor(name, size) {

this.size = size;

}

// 2

constructor(name, size) {

super(name);

this.size = size;

}

// 3

constructor(size) {

super(name);

this.size = size;

}

// 4

constructor(name, size) {

this.name = name;

this.size = size;

}

};

// A.
// 1

// B.
// 2

// C.
// 3

// D.
// 4

// 正确答案：
// B
// 解析：
// 在子类中，在调用super之前不能访问到this关键字。 如果这样做，它将抛出一个ReferenceError：1和4将引发一个引用错误。
// 使用super关键字，需要用给定的参数来调用父类的构造函数。 父类的构造函数接收name参数，因此我们需要将name传递给super。
// Labrador类接收两个参数，name参数是由于它继承了Dog，size作为Labrador类的额外属性，它们都需要传递给Labrador的构造函数，因此使用构造函数2正确完成。




// 输出是什么?
class Dog {

constructor(name) {

this.name = name;

}

}

Dog.prototype.bark = function() {

console.log(`Woof I am ${this.name}`);

};

const pet = new Dog("Mara");

pet.bark();

delete Dog.prototype.bark;

pet.bark();

// A.
// "Woof I am Mara", TypeError

// B.
// "Woof I am Mara","Woof I am Mara"

// C.
// "Woof I am Mara", undefined

// D.
// TypeError, TypeError

// 正确答案：
// A
// 解析：
// 我们可以用delete关键字删除对象的属性，对原型也是适用的。删除了原型的属性后，该属性在原型链上就不可用了。在本例中，函数bark在执行了delete Dog.prototype.bark后不可用, 然而后面的代码还在调用它。
// 当我们尝试调用一个不存在的函数时TypeError异常会被抛出。在本例中就是 TypeError: pet.bark is not a function，因为pet.bark是undefined.